package com.macro.mall.oms.service.order;

import com.github.pagehelper.Page;
import com.macro.mall.oms.domain.Order;
import com.macro.mall.oms.entity.OrderEntity;
import com.macro.mall.oms.service.order.bo.CreateOrderInput;
import com.macro.mall.oms.service.order.bo.PagedQueryOrderInput;
import com.macro.mall.oms.service.order.bo.UpdateOrderInput;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 订单Service
 *
 * @author xuyanjun
 * @date 2019-12-10
 */
public interface OrderService {

    /**
     * 取消订单
     *
     * @param orderId 订单id
     */
    void cancel(long orderId,String notifyUrl);

    /**
     * 创建订单
     *
     * @param input input
     * @return 新增id
     */
    long create(CreateOrderInput input);

    /**
     * 修改订单
     *
     * @param input input
     */
    void update(UpdateOrderInput input);

    /**
     * 修改订单预估状态
     *
     * @param id            id
     * @param predictStatus 预估状态
     */
    void updatePredictStatus(long id, int predictStatus);

    /**
     * 修改订单结算状态
     *
     * @param id           id
     * @param settleStatus 结算状态
     */
    void updateSettleStatus(long id, int settleStatus);

    /**
     * 删除订单
     *
     * @param id id
     */
    void delete(long id);

    /**
     * 根据Id获取订单
     *
     * @param id id
     * @return 订单
     */
    OrderEntity getById(long id);

    /**
     * 根据批量Id获取订单
     *
     * @param batchIds 批量ids
     * @return 订单集合
     */
    List<OrderEntity> listByBatchIds(List<Long> batchIds);

    /**
     * 获取可预估订单
     *
     * @param paymentTimeBeginTime 完成开始时间
     * @param paymentTimeEndTime   完成结束时间
     * @return 可结算订单
     */
    List<OrderEntity> listPredictable(LocalDateTime paymentTimeBeginTime, LocalDateTime paymentTimeEndTime);

    /**
     * 获取可结算订单
     *
     * @param completedBeginTime 完成开始时间
     * @param completedEndTime   完成结束时间
     * @return 可结算订单
     */
    List<OrderEntity> listSettlable(LocalDateTime completedBeginTime, LocalDateTime completedEndTime);

    /**
     * 分页查询
     *
     * @param input input
     * @return 分页的订单
     */
    Page<OrderEntity> pagedQuery(PagedQueryOrderInput input);

    /**
     * 将实体对象转换成domain对象
     *
     * @param orderEntity 实体
     * @return order
     */
    Order entityToDomain(OrderEntity orderEntity);

    /**
     * 将实体对象转换成domain对象
     *
     * @param orderEntities 实体
     * @return orders
     */
    List<Order> entityToDomain(List<OrderEntity> orderEntities);

}